package com.magic.web.common.controller;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class HttpUtils {

	private final static Logger logger = LoggerFactory
			.getLogger(HttpUtils.class);

	public static String sendMessageByGetWithUTF8(String url) throws Exception {
		StringBuilder responseStr = new StringBuilder();
		HttpRequestBase httpRequestBase = new HttpGet(url);
		InputStream input = getResponse(httpRequestBase);
		List<String> responseList = IOUtils.readLines(input, "UTF-8");
		for (String response : responseList) {
			responseStr.append(response);
		}
		return responseStr.toString();
	}

	public static String sendMessageByPost(String url, String json)
			throws Exception {
		StringBuilder responseStr = new StringBuilder();
		HttpPost httpPost = new HttpPost(url);
		httpPost.setHeader("content-type", "application/json");
		StringEntity entity = new StringEntity(json);
		httpPost.setEntity(entity);
		InputStream input = getResponse(httpPost);
		List<String> responseList = IOUtils.readLines(input);
		for (String response : responseList) {
			responseStr.append(response);
		}
		return responseStr.toString();
	}

	public static String sendMemCentorByPost(String url, String json)
			throws Exception {
		StringBuilder responseStr = new StringBuilder();
		HttpPost httpPost = new HttpPost(url);
		httpPost.setHeader("content-type", "application/json");
		StringEntity entity = new StringEntity(json,"UTF-8");
		httpPost.setEntity(entity);
		InputStream input = getResponse(httpPost);
		List<String> responseList = IOUtils.readLines(input,"UTF-8");
		for (String response : responseList) {
			responseStr.append(response);
		}
		return responseStr.toString();
	}

	public static String sendMessageDelayByPost(String url, String json)
			throws Exception {
		StringBuilder responseStr = new StringBuilder();
		HttpPost httpPost = new HttpPost(url);
		httpPost.setHeader("content-type", "application/json");
		StringEntity entity = new StringEntity(json);
		httpPost.setEntity(entity);
		 // 请求超时
		httpPost.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 180000);
        // 读取超时
		httpPost.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 1800000    );
		InputStream input = getResponse(httpPost);
		List<String> responseList = IOUtils.readLines(input);
		for (String response : responseList) {
			responseStr.append(response);
		}
		return responseStr.toString();
	}

	public static InputStream getResponse(HttpRequestBase request)
			throws Exception {
		HttpClient httpclient = new DefaultHttpClient();
		try {
			HttpResponse respose = httpclient.execute(request);
			HttpEntity entity = respose.getEntity();
			InputStream content = entity.getContent();
			return new ByteArrayInputStream(read(content));
		} catch (Exception e) {
			throw e;
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
	}

	private static byte[] read(InputStream input) throws IOException {
		ByteArrayOutputStream resp = new ByteArrayOutputStream();
		int b = 0;
		while ((b = input.read()) >= 0) {
			resp.write(b);
		}
		return resp.toByteArray();
	}

	/**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url
     *            发送请求的 URL
     * @param param
     *            请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常！"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }    
	
   /*public static void main(String[] args) {
		String openid = "123rewfds";
		String merOrderId = "XMRBAAAA00001";
		String transtype = "1";
		String requesttype = "HXSH";
		String statu = "4444eqw";
		String message = "成功";
		String sutograph1 = openid+merOrderId+requesttype+"XMRBKHZJ";
    	String sutograph = SecurityUtils.getMD5String(sutograph1).toUpperCase();
    	String jsonstr = "{'openid':'123rewfds','merOrderId':'XMRBAAAA00001','requesttype':'HXSH','transtype':'1','statu':'2222444','message':'成功','sutograph':'"+sutograph+"'}";
    	jsonstr = Base64.encodeBase64String(jsonstr.getBytes());
    	String respString = "";
		try {
			respString = HttpUtils.sendMemCentorByPost("http://wx.gwjlb.com/xmweb/OrderBack/orderBackWrite.do", jsonstr);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	System.out.println(respString);
    	respString = new String(Base64.decodeBase64(respString));
    	JSONObject json = JSONObject.parseObject(respString);
    	System.out.println(json.getString("statu"));
    	System.out.println(json.getString("message"));
    	
	}*/

}
